/*
 * Copyright (c) 2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License"),
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @addtogroup TeeTrusted
 * @{
 *
 * @brief TEE（Trusted Excution Environment）可信执行环境API。
 *
 * 提供安全能力API，例如可信存储、加解密及可信时间等，用于可信应用程序开发。
 *
 * @since 20
 */

/**
 * @file tee_log.h
 *
 * @brief 提供TEE日志API。
 *
 * 包含TEE日志API及其内部定义的参考信息。
 *
 * @library NA
 * @kit TEEKit
 * @include <TEEKit/tee_log.h>
 * @syscap SystemCapability.Tee.TeeClient
 * @since 20
 */

#ifndef __TEE_LOG_H
#define __TEE_LOG_H

#include "tee_defines.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief 定义TA日志的ERROR级别。
 *
 * @since 20
 */
#define TA_LOG_LEVEL_ERROR   0

/**
 * @brief 定义TA日志的WARNING级别。
 *
 * @since 20
 */
#define TA_LOG_LEVEL_WARNING 1

/**
 * @brief 定义TA日志的INFO级别。
 *
 * @since 20
 */
#define TA_LOG_LEVEL_INFO    2

/**
 * @brief 定义TA日志的DEBUG级别。
 *
 * @since 20
 */
#define TA_LOG_LEVEL_DEBUG   3

/**
 * @brief 定义TA日志的VERBO（详细）级别。
 *
 * @since 20
 */
#define TA_LOG_LEVEL_VERBO   4

/**
 * @brief 定义TA日志的默认级别。
 *
 * @since 20
 */
#define TA_LOG_LEVEL_DEFAULT  TA_LOG_LEVEL_INFO

/**
 * @brief 定义TA日志的默认级别。
 *
 * TA_LOG_LEVEL可由TA开发人员重新定义。
 *
 * @since 20
 */
#ifndef TA_LOG_LEVEL
#define TA_LOG_LEVEL TA_LOG_LEVEL_DEFAULT
#endif

/**
 * @brief 定义VERBO（详细）级别TA日志的标签。
 *
 * @since 20
 */
#define TAG_VERB  "[verb]"

/**
 * @brief 定义DEBUG级别TA日志的标签。
 *
 * @since 20
 */
#define TAG_DEBUG  "[debug]"

/**
 * @brief 定义INFO级别TA日志的标签。
 *
 * @since 20
 */
#define TAG_INFO  "[info]"

/**
 * @brief 定义WARNING级别TA日志的标签。
 *
 * @since 20
 */
#define TAG_WARN  "[warn]"

/**
 * @brief 定义ERROR级别TA日志的标签。
 *
 * @since 20
 */
#define TAG_ERROR "[error]"

/**
 * @brief 枚举日志的级别。
 *
 * @since 20
 */
typedef enum {
    /** 错误级别日志。 */
    LOG_LEVEL_ERROR = 0,
    /** 警告级别日志。 */
    LOG_LEVEL_WARN  = 1,
    /** 信息级别日志。 */
    LOG_LEVEL_INFO  = 2,
    /** 调试级别日志。 */
    LOG_LEVEL_DEBUG = 3,
    /** 详细（VERBO）级别日志。 */
    LOG_LEVEL_VERBO = 4,
    /** 开启日志记录。 */
    LOG_LEVEL_ON    = 5,
} LOG_LEVEL;

/**
 * @brief 提供UART日志打印功能。
 *
 * @param fmt [IN]指向日志信息的指针。
 *
 * @since 20
 */
void uart_cprintf(const char *fmt, ...);

/**
 * @brief 提供UART日志打印功能。
 *
 * @param fmt [IN]指向日志信息的指针。
 *
 * @since 20
 */
void uart_printf_func(const char *fmt, ...);

/**
 * @brief 提供TEE日志打印功能。
 *
 * @param log_level [IN]日志级别。
 * @param fmt [IN]指向日志信息的指针。
 *
 * @since 20
 */
void tee_print(LOG_LEVEL log_level, const char *fmt, ...);

/**
 * @brief 提供TEE驱动日志的打印功能。
 *
 * @param log_level [IN]日志级别。
 * @param log_tag [IN]日志标签。
 * @param fmt [IN]日志信息内容。
 *
 * @since 20
 */
void tee_print_driver(LOG_LEVEL log_level, const char *log_tag, const char *fmt, ...);

/**
 * @brief 定义全局调试前缀字符串。
 *
 * @since 20
 */
extern const char *g_debug_prefix;

#if (TA_LOG_LEVEL >= TA_LOG_LEVEL_VERBO)
#ifdef DRIVER_LOG_TAG
/**
 * @brief 定义用于在VERBO（详细）等级下输出TEE日志的宏接口（包含日志标签）。
 *
 * @since 20
 */
#define tlogv(fmt, args...) \
    tee_print_driver(LOG_LEVEL_VERBO, DRIVER_LOG_TAG, "%s %d:" fmt "", TAG_VERB, __LINE__, ##args)
#else
/**
 * @brief 定义用于在VERBO（详细）等级下输出TEE日志的宏接口（不含日志标签）。
 *
 * @since 20
 */
#define tlogv(fmt, args...) tee_print(LOG_LEVEL_VERBO, "%s %d:" fmt "", TAG_VERB, __LINE__, ##args)
#endif /* DRIVER_LOG_TAG */
#else
/**
 * @brief 定义空操作的tlogv宏，当日志等级低于VERBO时禁用详细日志。
 *
 * @since 20
 */
#define tlogv(fmt, args...) \
    do {                    \
    } while (0)
#endif /* TA_LOG_LEVEL >= TA_LOG_LEVEL_VERBO */

#if (TA_LOG_LEVEL >= TA_LOG_LEVEL_DEBUG)
#ifdef DRIVER_LOG_TAG
/**
 * @brief 定义用于在DEBUG等级下输出TEE日志的宏接口（包含日志标签）。
 *
 * @since 20
 */
#define tlogd(fmt, args...) \
    tee_print_driver(LOG_LEVEL_DEBUG, DRIVER_LOG_TAG, "%s %d:" fmt "", TAG_DEBUG, __LINE__, ##args)
#else
/**
 * @brief 定义用于在DEBUG等级下输出TEE日志的宏接口（不含日志标签）。
 *
 * @since 20
 */
#define tlogd(fmt, args...) tee_print(LOG_LEVEL_DEBUG, "%s %d:" fmt "", TAG_DEBUG, __LINE__, ##args)
#endif /* DRIVER_LOG_TAG */
#else
/**
 * @brief 定义空操作的tlogd宏，当日志等级低于DEBUG时禁用调试日志。
 *
 * @since 20
 */
#define tlogd(fmt, args...) \
    do {                    \
    } while (0)
#endif /* TA_LOG_LEVEL >= TA_LOG_LEVEL_DEBUG */

#if (TA_LOG_LEVEL >= TA_LOG_LEVEL_INFO)
#ifdef DRIVER_LOG_TAG
/**
 * @brief 定义用于在INFO等级下输出TEE日志的宏接口（包含日志标签）。
 *
 * @since 20
 */
#define tlogi(fmt, args...) \
    tee_print_driver(LOG_LEVEL_INFO, DRIVER_LOG_TAG, "%s %d:" fmt "", TAG_INFO, __LINE__, ##args)
#else
/**
 * @brief 定义用于在INFO等级下输出TEE日志的宏接口（不含日志标签）。
 *
 * @since 20
 */
#define tlogi(fmt, args...) tee_print(LOG_LEVEL_INFO, "%s %d:" fmt "", TAG_INFO, __LINE__, ##args)
#endif /* DRIVER_LOG_TAG */
#else
/**
 * @brief 定义空操作的tlogi宏，当日志等级低于INFO时禁用信息日志。
 *
 * @since 20
 */
#define tlogi(fmt, args...) \
    do {                    \
    } while (0)
#endif /* TA_LOG_LEVEL >= TA_LOG_LEVEL_INFO */

#if (TA_LOG_LEVEL >= TA_LOG_LEVEL_WARNING)
#ifdef DRIVER_LOG_TAG
/**
 * @brief 定义用于在WARNING等级下输出TEE日志的宏接口（包含日志标签）。
 *
 * @since 20
 */
#define tlogw(fmt, args...) \
    tee_print_driver(LOG_LEVEL_WARN, DRIVER_LOG_TAG, "%s %d:" fmt "", TAG_WARN, __LINE__, ##args)
#else
/**
 * @brief 定义用于在WARNING等级下输出TEE日志的宏接口（不含日志标签）。
 *
 * @since 20
 */
#define tlogw(fmt, args...) tee_print(LOG_LEVEL_WARN, "%s %d:" fmt "", TAG_WARN, __LINE__, ##args)
#endif /* DRIVER_LOG_TAG */
#else
/**
 * @brief 定义空操作的tlogw宏，当日志等级低于WARNING时禁用警告日志。
 *
 * @since 20
 */
#define tlogw(fmt, args...) \
    do {                    \
    } while (0)
#endif /* TA_LOG_LEVEL >= TA_LOG_LEVEL_WARNING */

#if (TA_LOG_LEVEL >= TA_LOG_LEVEL_ERROR) /* Always meet this condition. */
#ifndef TLOGE_NO_TIMESTAMP
#ifdef DRIVER_LOG_TAG
/**
 * @brief 定义用于在ERROR等级下输出TEE日志的宏接口（包含日志标签）。
 *
 * @since 20
 */
#define tloge(fmt, args...) \
    tee_print_driver(LOG_LEVEL_ERROR, DRIVER_LOG_TAG, "%s %d:" fmt " ", TAG_ERROR, __LINE__, ##args)
#else
/**
 * @brief 定义用于在ERROR等级下输出TEE日志的宏接口（不含日志标签）。
 *
 * @since 20
 */
#define tloge(fmt, args...) tee_print(LOG_LEVEL_ERROR, "%s %d:" fmt " ", TAG_ERROR, __LINE__, ##args)
#endif /* DRIVER_LOG_TAG */
#else
/**
 * @brief 定义用于在ERROR等级下输出TEE日志的宏接口（不使用日志系统时间戳）。
 *
 * @since 20
 */
#define tloge(fmt, args...) printf("[%s]%s %d:" fmt " ", g_debug_prefix, TAG_ERROR, __LINE__, ##args)
#endif /* TLOGE_NO_TIMESTAMP */
#else
/**
 * @brief 定义空操作的tloge宏，当日志等级低于ERROR时禁用错误日志。
 *
 * @since 20
 */
#define tloge(fmt, args...) \
    do {                    \
    } while (0)
#endif /* TA_LOG_LEVEL >= TA_LOG_LEVEL_ERROR */

/**
 * @brief 定义系统事件类型的枚举。
 *
 * @since 20
 */
typedef enum {
    /** 故障事件。 */
    FAULT = 1,
    /** 统计事件。 */
    STATISTIC  = 2,
    /** 安全事件。 */
    SECURITY  = 3,
    /** 行为事件。 */
    BEHAVIOR = 4,
} HISYSEVENT_TYPE;

/**
 * @brief 将DFX消息上报到HiViewOcean系统。
 *
 * @param domain 表示消息的域名。
 * @param event 表示消息的事件名称。
 * @param event_type 表示消息的事件类型。
 * @param fmt 表示日志消息的格式字符串。
 *
 * @since 20
 */
void tee_report(const char *domain, const char *event, HISYSEVENT_TYPE event_type, const char *fmt, ...);

#ifdef __cplusplus
}
#endif

#endif /* __TEE_LOG_H */
/** @} */